-- @����: baidwwy
local _Class 	= {}--���游��
local function __Call(t, ... )--��".new"
	return t.new(...)
end
local function _Create(self,ct,...)--���캯��
	for i,v in ipairs(ct.super) do
	 	_Create(self,v,...)--�̳�����
	end
	if ct.ctor then ct.ctor(self,...) end
end
local function _RunSuper(t ,... )--���и�����
	return _Class[t.t][t.k](t.obj,...)
end
local _GetSuper = setmetatable({}, {__index=function (t,k)
	if _Class[t.t][k] then--��ȡ������
		t.k = k
    	return _RunSuper
	end
end})
function class(...)
	local ct 	= {ctor=false,super={...}}--new�Ķ���
	_Class[ct] 	= {}--�ຯ��ʵ�ʱ���
	ct.new 	= function(...)
		local ctor = {}
			setmetatable(ctor,{ __index = function (t,k)
				if _Class[k] then
					_GetSuper.obj,_GetSuper.t = t,k--����,����
				    return _GetSuper
				end
				return _Class[ct][k]
			end})
			_Create(ctor,ct,...)--�ݹ����и���
		return ctor
	end
	if #ct.super > 0 then--�̳к���
		setmetatable(_Class[ct],{__index = function (t,k)
		    for i,v in ipairs(ct.super) do
		        local ret = _Class[v][k]
		        if ret then return ret end
		    end
		end})
	end
	return setmetatable(ct,{__newindex=_Class[ct],__call=__Call})
end